package tp.algo2.futbol
import java.util.ArrayList
import java.util.List
import tp.algo2.futbol.refactoring.AlexBaico.Datos

class Jugador {
		
	@Property TipoDeJugador tipoJugador
	@Property List<NotificadorXMail> observers
	@Property List<Jugador> amigos
	@Property Object infraccion 
	@Property Mail mail

	/* @Property String nombre   //Refactoring Alex Baico
	@Property String Direccion	 //Clase "Datos" para los datos de los jugadores
	@Property String Edad
	*/
	@Property Datos datos
	
	@Property List<String> puntajesAceptados
	@Property List<String> puntajesRechazados
	@Property List<String> criticas
	@Property List<Partido> partidosJugados
	
	@Property int golesAnotados
	
/// Refactoring Karina ///////////////////////////////////////////////////////////////////////////

	@Property Integer cantidadTarjetasAmarillas = 0
	@Property Integer cantidadTarjetasRojas = 0
	@Property Integer puntos = 100
	@Property Integer contadorCeroPuntos = 0
	@Property Integer grave = 20
	@Property Integer leve = 10
	@Property Object expulsado = false
	@Property Object suspendido = false
	@Property Integer inhabilitado = 0
		
///////////////////////////////////////////////////////////////////////////////////////////////////	
	
	
	Invoker invoker
		
		
	new(){
		observers = new ArrayList
		amigos = new ArrayList	
		partidosJugados = new ArrayList	
		puntajesAceptados = new ArrayList	
		puntajesRechazados = new ArrayList	
		criticas = new ArrayList
			
		}
	
	
	
	def boolean puedeJugar(Partido partido){
		tipoJugador.puedeJugar(partido)
	}
	
	def tipo(){
		tipoJugador.tipo
	}
	
	def agregarObserver(NotificadorXMail obser){
		observers.add(obser)		
	}
	
	def removerObserver(Object obser){
		observers.remove(obser)
	}
		
	def notificarAmigos(){
		observers.forEach[ob | ob.notificarAmigos(amigos,this)] 
	}
	
	def agregarAmigo(Jugador amigo){
		amigos.add(amigo)		
	}
	
	def removerAmigo(Jugador amigo){
		amigos.remove(amigo)
	}
	def cantidadAmigos(){
		amigos.size	
	}
	def cantidadObservers(){
		observers.size
	}
	
	def darDeBajaSinReemplazoA(Partido partido, TipoInfraccion infraccion){ 
		partido.sacarJugador(this)
		this.infraccionPor(infraccion)
	}
	
	def darDeBajaConReemplazoA(Partido partido, Jugador jugador){
		partido.agregarJugador(this)
		partido.sacarJugador(this)
	}
	
	
	def infraccionPor(TipoInfraccion tipo){
		tipo.infraccion 
	}
	////////////////////////////      TP4       /////////////////////////////
	
		
		
	def agregarPartidosJugados(Partido partido){//// jugador conoce los partidos jugados
		partidosJugados.add(partido)
	}
	
 	def partidoJugadoAelegir(){ //// selecciona un partido a cailifcar
		partidosJugados.get(0)		
	}
	
		
	def recomendarAmigo(Object fulanito){       //// elegir  la accion seleccionar amigo      
		invoker.hacerOperacion(fulanito,this)
		}
			
	def calificacionesPartido(){     //// elegir la accion calificar
		invoker.hacerOperacion(this.partidoJugadoAelegir,this)
		}
		
	def seleccionarInvoker(Invoker invok){
		invoker = invok
	}
	def cambiarAccion(Icommand comando){  //// cambiar otra accion
		invoker.cambiarComando(comando)
	}
	
	def datos(Jugador jugador) {   //// devolver datos de jugador en caso de si administrador acepta jugador
	
   		//this.getNombre + " " + this.getDireccion + " " + this.getEdad   //Refactoring Alex Baico
   		datos.getDatos()
   	}   	
   	   	   	
   	   	
   	def puntuado(String nota){
   		puntajesAceptados.add(nota)
   	}
   	
   	def puntajeRechazado(String nota){
   	puntajesRechazados.add(nota)
   	}
	def todosLosPuntajes(){
		return puntajesAceptados
	}
	
	def criticar(Jugador jugador){
		jugador.criticado("critica de: "+ this)
	}
	
	def criticado(String critica){
		criticas.add(critica)
	}
	/*tp5 miguel angel lunda medrano */
	
	def int totalGoles(){
		golesAnotados
			}
			
/// Refactoring Karina ///////////////////////////////////////////////////////////////////////////
	
	def contadorCeroPts () {
		if (this.puntos.equals(0)) {
             	this.contadorCeroPuntos = this.contadorCeroPuntos + 1
       		}
	}

//////////////////////////////////////////////////////////////////////////////////////////////////		
	
	
}